package com.xiaoyao.myframeapp;

import android.app.Activity;
import android.app.Application;
import android.app.Service;
import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.os.Environment;
import android.os.Vibrator;
import android.support.multidex.MultiDex;

import com.baidu.location.BDLocation;
import com.baidu.mapapi.SDKInitializer;
import com.bilibili.boxing.BoxingCrop;
import com.bilibili.boxing.BoxingMediaLoader;
import com.bilibili.boxing.loader.IBoxingMediaLoader;
import com.google.gson.Gson;
import com.tencent.bugly.Bugly;
import com.tencent.bugly.BuglyStrategy;
import com.tencent.bugly.beta.Beta;
import com.xiaoyao.myframeapp.location.LocationService;
import com.xiaoyao.myframeapp.utils.Boxing.BoxingGlideLoader;
import com.xiaoyao.myframeapp.utils.Boxing.BoxingUcrop;

import org.xutils.x;

import java.util.ArrayList;
import java.util.List;

import static com.uuzuche.lib_zxing.activity.ZXingLibrary.initDisplayOpinion;

//import com.bilibili.boxing.BoxingCrop;
//import com.bilibili.boxing.BoxingMediaLoader;
//import com.bilibili.boxing.loader.IBoxingMediaLoader;

//import org.xutils.x;

/**
 * @author Administrator
 * @Author xiaoyao
 * @Email xiao80206040@qq.com
 * @Explain
 * @date 2018/7/3 0003
 */
public class FrameApplication extends Application {

    private static List<Activity> activitys = new ArrayList<>();
    private static FrameApplication instance;
    private static Context mContext;
    //TODO 百度
    public static BDLocation loc;
    public Vibrator mVibrator;
    public LocationService locationService;

    public static FrameApplication getInstance() {
        return instance;
    }


    public static Context getmContext() {
        return mContext;
    }

    public static List<Activity> getActivitys() {
        return activitys;
    }

    public static void setActivitys(List<Activity> activitys) {
        FrameApplication.activitys = activitys;
    }

    public static boolean is_WebSocketImpl_DEBUG = true;// 是否需要打印bug tcp Log
    public static boolean isDebug = true;// 是否需要打印bug，L.i();

    @Override
    protected void attachBaseContext(Context base) {
        super.attachBaseContext(base);
        //TODO 解决65536问题
        MultiDex.install(base);

        // 安装tinker
//        Beta.installTinker();
    }

    @Override
    public void onCreate() {
        super.onCreate();
        mContext = this;

//        MobSDK.init(this);
        //TODO 添加xUtils
        addxUtils();
        //TODO 添加 定位
//        addLocation();
        //TODO 添加 Boxing
        addBoxing();
        //TODO 添加 腾讯bug收集器
        addBugly();
        //TODO 添加 二维码
        initDisplayOpinion(this);


        if (instance == null) {
            instance = this;
        }
    }

    private void addxUtils() {

        x.Ext.init(this);
//        x.Ext.setDebug(BuildConfig.DEBUG); // 是否输出debug日志, 开启debug会影响性能.
    }

    /***
     * 初始化定位sdk，建议在Application中创建
     */
    private void addLocation() {
        locationService = new LocationService(getmContext());
        mVibrator = (Vibrator) getApplicationContext().getSystemService(Service.VIBRATOR_SERVICE);
        SDKInitializer.initialize(getApplicationContext());
    }

    private void addBoxing() {
        //TODO 初始化Boxing
        IBoxingMediaLoader loader = new BoxingGlideLoader();
        BoxingMediaLoader.getInstance().init(loader);
        BoxingCrop.getInstance().init(new BoxingUcrop());
    }

    //TODO 建议在测试阶段建议设置成true，发布时设置为false。 false 是关闭  ?  延迟上传
    private static boolean Bugly_isDebug = true;
    // TODO 替换成bugly上注册的appid
    private static final String APP_ID = "9a6d72aac8";
    // TODO 自定义渠道
    public static String APP_CHANNEL = "DEBUG";

    private void addBugly() {
        APP_CHANNEL = getChannelName(this, "PUB_CHANNEL");

        //TODO 初始化 Bugly  腾讯bug收集器 注册时申请的APPID = ddcebd1325
        /***** Beta高级设置 *****/
        /**
         * true表示app启动自动初始化升级模块; false不会自动初始化;
         * 开发者如果担心sdk初始化影响app启动速度，可以设置为false，
         * 在后面某个时刻手动调用Beta.init(getApplicationContext(),false);
         */
        Beta.autoInit = true;

        /**
         * true表示初始化时自动检查升级; false表示不会自动检查升级,需要手动调用Beta.checkUpgrade()方法;
         */
        Beta.autoCheckUpgrade = true;

        /**
         * 设置升级检查周期为60s(默认检查周期为0s)，60s内SDK不重复向后台请求策略);
         */
//        Beta.upgradeCheckPeriod = 60 * 1000;
        /**
         * 设置启动延时为1s（默认延时3s），APP启动1s后初始化SDK，避免影响APP启动速度;
         */
//        Beta.initDelay = 4 * 1000;
        /**
         * 设置通知栏大图标，largeIconId为项目中的图片资源;
         */
        Beta.largeIconId = R.mipmap.ic_launcher;
        /**
         * 设置状态栏小图标，smallIconId为项目中的图片资源Id;
         */
        Beta.smallIconId = R.mipmap.ic_launcher;
        /**
         * 设置更新弹窗默认展示的banner，defaultBannerId为项目中的图片资源Id;
         * 当后台配置的banner拉取失败时显示此banner，默认不设置则展示“loading“;
         */
        Beta.defaultBannerId = R.mipmap.ic_launcher;
        /**
         * 设置sd卡的Download为更新资源保存目录;
         * 后续更新资源会保存在此目录，需要在manifest中添加WRITE_EXTERNAL_STORAGE权限;
         */
        Beta.storageDir = Environment
                .getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);
        /**
         * 已经确认过的弹窗在APP下次启动自动检查更新时会再次显示;
         */
        Beta.showInterruptedStrategy = true;
        /**
         * 只允许在MainActivity上显示更新弹窗，其他activity上不显示弹窗; 不设置会默认所有activity都可以显示弹窗;
         */
//        Beta.canShowUpgradeActs.add(HomeActivity.class);
        /**
         * 如果你不想在通知栏显示下载进度，你可以将这个接口设置为false，默认值为true。
         */
        Beta.enableNotification = true;
        /**
         *如果你想在Wifi网络下自动下载，可以将这个接口设置为true，默认值为false。
         */
        Beta.autoDownloadOnWifi = false;
        /**
         *如果你使用我们默认弹窗是会显示apk信息的，如果你不想显示可以将这个接口设置为false。
         */
        Beta.canShowApkInfo = true;
        /**
         *升级SDK默认是开启热更新能力的，如果你不需要使用热更新，可以将这个接口设置为false。
         */
//        Beta.enableHotfix = true;
        Beta.enableHotfix = false;


        /***** Bugly高级设置 *****/
        BuglyStrategy strategy = new BuglyStrategy();
        /**
         * 设置app渠道号
         */
        strategy.setAppChannel(APP_CHANNEL);

        /***** 统一初始化Bugly产品，包含Beta *****/
        Bugly.init(getmContext(), APP_ID, Bugly_isDebug, strategy);
    }

    /**
     * 获取渠道名
     *
     * @param ctx 此处习惯性的设置为activity，实际上context就可以
     * @param key
     * @return 如果没有获取成功，那么返回值为空
     */
    public static String getChannelName(Context ctx, String key) {
        if (ctx == null) {
            return null;
        }
        String channelName = null;
        try {
            PackageManager packageManager = ctx.getPackageManager();
            if (packageManager != null) {
                //注意此处为ApplicationInfo 而不是 ActivityInfo,因为友盟设置的meta-data是在application标签中，而不是某activity标签中，所以用ApplicationInfo
                ApplicationInfo applicationInfo = packageManager.getApplicationInfo(ctx.getPackageName(), PackageManager.GET_META_DATA);
                if (applicationInfo != null) {
                    if (applicationInfo.metaData != null) {
                        channelName = applicationInfo.metaData.getString(key);
                    }
                }

            }
        } catch (PackageManager.NameNotFoundException e) {
            e.printStackTrace();
        }
        return channelName;
    }

    //******************************************版本兼容************************************************
    private static Gson gson = new Gson();

    private static Gson getgson() {
        synchronized (FrameApplication.class) {
            if (gson == null) {
                gson = new Gson();
            }
        }
        return gson;
    }

    //TODO 类 》》 json
    public static String toJson(Object o) {
        String result = getgson().toJson(o);
        return result;
    }

    //TODO json 》》 类
    public static <T> T fromJson(String s, Class<T> type) {
        return getgson().fromJson(s, type);
    }

}
